﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AcademiaEntidades;
using System.Data;
using System.Data.SqlClient;

namespace AcademiaDAO
{
    public class ExamenDAO
    {
        //Metodo para guardar un examen con su detalle
        public static void guardarExamen(Examen examen, List<DetalleExamen> dtExamen)
        {
            SqlConnection cn = null;
            SqlTransaction trans = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                trans = cn.BeginTransaction();
                string sql = string.Empty;
                SqlCommand cmd = new SqlCommand();
                //Armo la sentencia y parametros para guardar el examen
                sql = @"insert into Examen(IdCurso, Fecha, Numero, Hora, IdProfesor, IdTipoExamen) 
                        values(@IdCurso, @Fecha, @Numero, @Hora, @IdProfesor, @IdTipoExamen)";

                cmd.Parameters.AddWithValue("@IdCurso", examen.IdCurso);
                cmd.Parameters.Add(new SqlParameter("@Fecha", examen.Fecha));
                cmd.Parameters.AddWithValue("@Numero", examen.Numero);
                cmd.Parameters.AddWithValue("@Hora", examen.Hora);
                cmd.Parameters.AddWithValue("@IdProfesor", examen.IdProfesor);
                cmd.Parameters.Add(new SqlParameter("@IdTipoExamen", examen.IdTipoExamen));

                cmd.Connection = cn;
                cmd.Transaction = trans;
                cmd.CommandText = sql;

                if (cmd.ExecuteNonQuery() == 0)
                    throw new Exception("No se pudo guardar el Examen...");

                //Recupero el IdExamen, una vez guardado el examen
                //sql = "SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]";//Lo probe sqlserver funciona
                sql = @"SELECT @@IDENTITY AS 'IDENTIDAD'";
                SqlCommand cmd1 = new SqlCommand(sql,cn,trans);
                int idExamen = int.Parse(cmd1.ExecuteScalar().ToString());
                
                //Si se pudo guardar el examen comienzo a guardar el detalle
                //Se limpia los parametros de la otra setencia
                cmd.Parameters.Clear();
                //Se arma la otra setencia sql
                sql = @"insert into DetalleExamen(IdExamen, IdAlumno, Nota, Descripcion) 
                        values(@IdExamen, @IdAlumno, @Nota, @Descripcion)";
                cmd.CommandText = sql;
                //Por cada elemento de la lista agrego los parametros y ejecuto el command
                foreach (DetalleExamen detalle in dtExamen)
                {
                    cmd.Parameters.AddWithValue("@IdExamen", idExamen);
                    cmd.Parameters.Add(new SqlParameter("@IdAlumno", detalle.IdAlumno));
                    cmd.Parameters.AddWithValue("@Nota", detalle.Nota);
                    if (!string.IsNullOrEmpty(detalle.Descripcion))
                        cmd.Parameters.AddWithValue("@Descripcion", detalle.Descripcion);
                    else
                        cmd.Parameters.AddWithValue("@Descripcion", DBNull.Value);

                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
                //Si todo se guardo bien lanzo el commit
                trans.Commit();
            }
            catch (Exception ex)
            {
                if (trans != null)
                    trans.Rollback();
                throw;
            }
            finally
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
        }//Fin del metodo guardarExamen
        //Metodo para traer todos los examenes en una sola consulta
        public static List<ExamenConsulta> obtenerTodosExamenes(string orden, DateTime? fechaExamen, int? idCurso, string nomProfesor, string nomAlumno, string apeProfesor, string apeAlumno)
        {
            List<ExamenConsulta> listaExamenes = new List<ExamenConsulta>();
            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                
                string sql = @"select C.Nombre as NombreCurso, TE.Descripcion as Examen, E.Fecha, E.Hora, E.Numero as NumeroExamen, P.Nombre as NombreProfesor, 
                                P.Apellido as ApellidoProfesor, A.Nombre as NombreAlumno, A.Apellido as ApellidoAlumno, A.Legajo as LegajoAlumno, 
                                DE.Nota from Examen E, DetalleExamen DE, Curso C, TipoExamen TE, Profesor P, Alumno A where E.IdCurso = C.IdCurso 
                                and E.IdProfesor = P.IdProfesor and E.IdTipoExamen= TE.IdTipoExamen and E.IdExamen = DE.IdExamen and DE.IdAlumno = A.IdAlumno ";
                if (idCurso.HasValue)
                {
                    sql += " and C.IdCurso = @idCurso";
                    cmd.Parameters.Add(new SqlParameter("@idCurso", idCurso));
                }
                if (!string.IsNullOrEmpty(nomProfesor))
                {
                    sql += " and P.Nombre like @nomProfesor";
                    cmd.Parameters.Add(new SqlParameter("@nomProfesor", '%' + nomProfesor + '%'));
                }
                if (!string.IsNullOrEmpty(nomAlumno))
                {
                    sql += " and A.Nombre like @nomAlumno";
                    cmd.Parameters.Add(new SqlParameter("@nomAlumno", '%' + nomAlumno + '%'));
                }
                if (!string.IsNullOrEmpty(apeProfesor))
                {
                    sql += " and P.Apellido like @apeProfesor";
                    cmd.Parameters.Add(new SqlParameter("@apeProfesor", '%' + apeProfesor + '%'));
                }
                if (!string.IsNullOrEmpty(apeAlumno))
                {
                    sql += " and A.Apellido like @apeAlumno";
                    cmd.Parameters.Add(new SqlParameter("@apeAlumno", '%' + apeAlumno + '%'));
                }
                if (fechaExamen != null)
                {
                    sql += " and E.Fecha = @fechaExamen";
                    cmd.Parameters.Add(new SqlParameter("@fechaExamen", fechaExamen));
                }
                sql += " order by " + orden;

                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    ExamenConsulta examenConsulta = new ExamenConsulta();
                    examenConsulta.NombreCurso = dr["NombreCurso"].ToString();
                    examenConsulta.Examen = dr["Examen"].ToString();
                    examenConsulta.Fecha = (DateTime)dr["Fecha"];
                    examenConsulta.Hora = (TimeSpan)dr["Hora"];
                    examenConsulta.NumeroExamen = int.Parse(dr["NumeroExamen"].ToString());
                    examenConsulta.NombreProfesor = dr["NombreProfesor"].ToString();
                    examenConsulta.ApellidoProfesor = dr["ApellidoProfesor"].ToString();
                    examenConsulta.NombreAlumno = dr["NombreAlumno"].ToString();
                    examenConsulta.ApellidoAlumno = dr["ApellidoAlumno"].ToString();
                    examenConsulta.LegajoAlumno = int.Parse(dr["LegajoAlumno"].ToString());
                    examenConsulta.Nota = int.Parse(dr["Nota"].ToString());
                    listaExamenes.Add(examenConsulta);
                    examenConsulta = null;
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudieron obtener los datos...");
            }
            finally
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }


            return listaExamenes;
        }
    }
}
